#include "log.h"

static int log_fd = -1;

// 初始化日志文件
void log_init() 
{
    // 1. 如果log.txt不存在 → 创建新文件，权限0644
    //   0 - 特殊权限位
    //   6 - 所有者: 读(4) + 写(2) = 6
    //   4 - 所属组: 读(4)
    //   4 - 其他用户: 读(4)
    //
    // 2. 如果log.txt已存在 → 打开现有文件
    // 3. 文件指针定位到文件末尾（由于O_APPEND）追加模式
    // 4. 返回文件描述符，后续用write()写入
    log_fd = open("log.txt", 
        O_WRONLY | O_CREAT | O_APPEND, 0644);
    if (log_fd >= 0) 
    {
        char buf[] = "=== 开始记录 ===\n";
        write(log_fd, buf, strlen(buf));
    }
}

void log_close() 
{
    if (log_fd >= 0) 
    {
        close(log_fd);   // 关闭文件描述符
        log_fd = -1;     // 重置为无效状态
    }
}

static void write_log(const char *msg) 
{
    // 检查文件描述符是否有效
    if (log_fd >= 0) 
    {
        // 使用write系统调用写入数据
        // write(文件描述符, 数据缓冲区, 数据长度)
        write(log_fd, msg, strlen(msg));
    }
}

void log_media(const char *action, const char *song_name, const char *singer) 
{
    char buf[256];           // 缓冲区，存储格式化后的日志
    time_t t = time(NULL);   // 获取当前时间戳
    
    // 格式化日志信息
    // snprintf防止缓冲区溢出
    //snprintf(buf, sizeof(buf), "[%ld] 媒体: %s %s\n", 
    //t, action, song);
    snprintf(buf, sizeof(buf), "[%ld] 媒体: %s %s - %s\n", t, action, song_name, singer);
    // 写入日志文件
    write_log(buf);
}

void log_vehicle(float speed, float fuel, float temp) 
{
    char buf[256];
    time_t t = time(NULL);  
    // 格式化车辆状态信息，保留适当的小数位数
    snprintf(buf, sizeof(buf), "[%ld] 车辆: %.0fkm/h %.1f%% %.1f°C\n", 
             t, speed, fuel, temp);
    write_log(buf);
}

void log_gps(double lat, double lon) 
{
    char buf[256];
    time_t t = time(NULL);  
    // 格式化GPS信息，保留4位小数精度
    snprintf(buf, sizeof(buf), "[%ld] GPS: %.4f,%.4f\n", 
    t, lat, lon);
    write_log(buf);
}

void log_print_all() {
    int fd = open("log.txt", O_RDONLY);
    if (fd < 0) {
        printf("无日志文件\n");
        return;
    }
    
    // 简单方法：直接读取到足够大的缓冲区
    char buf[10000];  // 10KB缓冲区，足够存储日志
    // 读取文件内容到缓冲区
    int n = read(fd, buf, sizeof(buf)-1);
    
    if (n > 0) {
        buf[n] = '\0';// 在数据末尾添加字符串结束符
        printf("%s", buf);// 将缓冲区内容作为字符串输出
    }
    
    close(fd);
}

